{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction to Quantitative Finance\n",
    "\n",
    "Copyright (c) 2019 Python Charmers Pty Ltd, Australia, <https://pythoncharmers.com>. All rights reserved.\n",
    "\n",
    "<img src=\"img/python_charmers_logo.png\" width=\"300\" alt=\"Python Charmers Logo\">\n",
    "\n",
    "Published under the Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) license. See `LICENSE.md` for details.\n",
    "\n",
    "Sponsored by Tibra Global Services, <https://tibra.com>\n",
    "\n",
    "<img src=\"img/tibra_logo.png\" width=\"300\" alt=\"Tibra Logo\">\n",
    "\n",
    "\n",
    "## Module 1.2: Covariance and Correlation\n",
    "\n",
    "### 1.2.2 Correlation\n",
    "\n",
    "\n",
    "In the last module, we saw the covariance of two variables, defined as\n",
    "\n",
    "$cov(X,Y) = E[(X-E[X])(Y-E[Y])]$\n",
    "\n",
    "Which reduces to the easier-to-compute form as:\n",
    "\n",
    "$cov(X,Y) = E[XY] - E[X]E[Y]$\n",
    "\n",
    "The covariance is a useful metric, but has a dimensionality problem.\n",
    "That is, if we have two random variables $X$ and $Y$, where $X$ is a person's height in cm, and $Y$ is a person's \n",
    "weight in kilograms, the resulting covariance has units of $cmkg$, which is not a unit most people have experience and an intuition about. For example, what does a covariance of 5cmkg mean?\n",
    "\n",
    "To fix this, we can normalise the covariance, and obtain the correlation. This gives a bounded range between -1 and 1, and more represents the degree that two variables move together, independent of the scale of the values.\n",
    "\n",
    "For instance, let's setup two sets of data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%run setup.ipy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Heights, in cm\n",
    "X = np.array([188.53675454, 184.70654578, 151.09735791, 164.36483092,\n",
    "       168.26683755, 164.16100367, 192.05069779, 165.76617936,\n",
    "       168.06909493, 188.90621868, 174.92165251, 153.59884988,\n",
    "       175.2229729 , 191.1264832 , 173.65462449, 174.29709269,\n",
    "       174.42391046, 148.76843808, 195.88238234, 177.81542544])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Weights, in kg\n",
    "Y = np.array([ 97.16635985,  66.56711927,  78.46545355,  82.73956732,\n",
    "        50.27365043,  71.2523942 , 110.05660504,  63.83136855,\n",
    "        54.91020919,  82.22492553,  91.159724  ,  63.59812684,\n",
    "        53.32374706,  63.87788126,  92.49811908,  57.29296249,\n",
    "        87.04770013,  46.03189333,  59.9751531 ,  84.22532972])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "87.38932004789447"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.cov(X, Y)[0, 1]  # For the reason we need to sub-index, see the previous module."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This covariance is positive, so we know that as X changes, Y changes in the same direction. The value itself is nearly meaningless to us here, and one should be careful to try and interpret it.\n",
    "\n",
    "Correlation can be computed a couple of different ways, but the most useful (and most common) for us here is to derive it from the covariance. \n",
    "\n",
    "As the covariance is:\n",
    "\n",
    "$cov(X,Y) = E[(X-E[X])(Y-E[Y])]$\n",
    "\n",
    "The correlation is a normalisation of this value:\n",
    "\n",
    "$corr(X,Y) = \\frac{cov(X, Y)}{\\sigma_X \\sigma_Y}$\n",
    "\n",
    "Which is:\n",
    "\n",
    "$corr(X, Y) = \\frac{E[(X-E[X])(Y-E[Y])]}{\\sigma_X \\sigma_Y}$\n",
    "\n",
    "As both $\\sigma_X$ and $\\sigma_Y$ have the same dimension as the original $X$ and $Y$, the value $\\sigma_X \\sigma_Y$ has the same dimension as the covariance. In our previous example, the standard deviation of $X$ is about 29.3cm and the standard deviation of $Y$ is about 58.65kg, so the value $\\sigma_X \\sigma_Y$ is approximately 1720 cmkg. This unit cancels out the unit of the covariance term (the numerator in the fraction), giving a dimensionless value."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercises\n",
    "\n",
    "For each of the next three questions, work out the answer using three techniques:\n",
    "\n",
    "* Intuitively guess the answer\n",
    "* Write some code to estimate the answer (for instance, create a random variable `X = np.random.randn...`)\n",
    "* Solve mathematically \n",
    "\n",
    "Find the following three values:\n",
    "\n",
    "1. What is the correlation of a variable with itself?\n",
    "2. What is the correlation of the negation of a variable with itself?\n",
    "3. What is the correlation of a randomly-chosen variable with another randomly-chosen variable?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The correlation of something with itself is 1 intuitively, i.e. perfect correlation.\n",
      "1.0\n"
     ]
    }
   ],
   "source": [
    "# (1)\n",
    "print(\"The correlation of something with itself is 1 intuitively, i.e. perfect correlation.\")\n",
    "\n",
    "vals = np.random.rand(1, 10)\n",
    "correl = np.corrcoef(vals,vals)\n",
    "\n",
    "print(correl[0,0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "corr(x,x) = E(X-E[X])^2/var(x)\n",
    "\n",
    "Since E(X-E(X))^2 = var(x), corr(x,x) = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Intuitively the answer is -1.\n",
      "-1.0\n"
     ]
    }
   ],
   "source": [
    "# (2)\n",
    "print(\"Intuitively the answer is -1.\")\n",
    "\n",
    "\n",
    "print(np.corrcoef(vals,np.negative(vals))[0,1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### (3)\n",
    "$corr(X, Y) = \\frac{E[(X-E[X])(Y-E[Y])]}{\\sigma_X \\sigma_Y}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### What the correlation tells us\n",
    "\n",
    "The correlation is a measure, similar to the covariance, except that it is easier to intuitively grasp. A correlation of 1 is a perfect correlation - $X$ increases exactly as $Y$ increases. Here is an example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.random.random(10)  # 10 random values\n",
    "Y1 = X + 2\n",
    "np.corrcoef(X, Y1)[0, 1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, even though $X$ and $Y1$ have different scales, they \"move together\" perfectly. A correlation of -1 is the minimum, and represents a perfect negation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "Y2 = -X * 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.0"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.corrcoef(X, Y2)[0, 1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Again, different scales, but the correlation simply tells us about how they move together. To get a visual sense of this, let's graph those values:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2215a5abd90>]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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zzzzTKilAQCACBLyyojX69WhQ4dUWFh41X4lJSVauHCh3njjDX366ad67733tHHjRi1YsKDFMXPmzJHP5ws8Tp8+HWqZAADgBucwxphgB+Xl5Wn9+vXasWOH+vbte9W+o0aN0t13360XXngh0LZ69Wrl5ubqf//7n2Jirp2HKisr5XK55PP5lJCQEGy5AADAgta+fwd1msYYo8cee0zr1q1TSUnJNYOIJJ0/f/6KwNGpU6fA1wMAAB1bUGHE6/WqoKBA69evV3x8vMrLyyVJLpdLXbt2lSRlZ2erd+/eys/PlyRNnDhRL7/8sn75y19qxIgROnbsmJ566ilNnDgxEEoAAEDHFVQYWbJkiSRpzJgxTdrffvttPfzww5KkU6dONVkJmTdvnhwOh+bNm6evvvpKN998syZOnKjnn3/++ioHAABRIaQ9I+HGnhEAACJPa9+/uTcNAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwDQxkpLpbFj/UcA10YYAYA2tnKlVFwsrVpluxIgMsTaLgAAosHJk1JFheRwSGvW+NsKC6WcHMkYKTFR6tPHbo3AjYowAgBtIDW18WOHw388d05KS2tsNyasJQERg9M0ANAGVq+WYn/49a4hdDQcY2P9zwNoXlBhJD8/X8OHD1d8fLzcbrcyMzN19OjRa4777rvv5PV6lZycLKfTqf79+6uoqCjkogHgRpOVJe3d2/xze/f6nwfQvKBO02zfvl1er1fDhw/XxYsXNXfuXI0fP16HDx/WT3/602bH1NbW6r777pPb7dbatWvVu3dvnTx5Ut26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kY4dO6ZHH31UdXV1mj9/fjjKjgqhzP2UKVNUUVGhe+65R8YYXbx4UY888ojmzp0bjpI7rJbeYysrK/X999+ra9eurf5aEbMygsi1aNEiFRYWat26derSpYvtcqJWVVWVpk6dqmXLlikxMdF2OR1OfX293G633nzzTaWlpWnSpEl68skntXTpUtulRb2SkhItXLhQb7zxhj799FO999572rhxoxYsWGC7NLRSxKyMJCYmqlOnTjp79myT9rNnzyopKanZMUlJSUH1R/NCmfsGL774ohYtWqSPPvpIQ4YMac8yo06w8/7ll1+qrKxMEydODLTV19dLkmJjY3X06FH169evfYuOEqH8m09OTlbnzp3VqVOnQNvAgQNVXl6u2tpaxcXFtWvN0SKUuX/qqac0depU/e53v5MkDR48WNXV1crNzdWTTz6pmBh+724PLb3HJiQkBLUqIkXQykhcXJzS0tK0devWQFt9fb22bt2q9PT0Zsekp6c36S9JW7ZsabE/mhfK3EvS4sWLtWDBAm3evFnDhg0LR6lRJdh5HzBggA4ePKgDBw4EHr/5zW/0q1/9SgcOHJDH4wln+REtlH/zGRkZOnbsWCAAStIXX3yh5ORkgkgQQpn78+fPXxE4GkKh4fZr7aZN32OD3vJqUWFhoXE6nWbFihXm8OHDJjc313Tr1s2Ul5cbY4yZOnWqeeKJJwL9P/74YxMbG2tefPFFc+TIETN//nwu7Q1RsHO/aNEiExcXZ9auXWvOnDkTeFRVVdn6FiJSsPP+Y1xNE7pg5/7UqVMmPj7e5OXlmaNHj5oNGzYYt9ttnnvuOVvfQsQKdu7nz59v4uPjzT/+8Q9z/Phx869//cv069fPPPTQQ7a+hYhUVVVl9u/fb/bv328kmZdfftns37/fnDx50hhjzBNPPGGmTp0a6N9wae+f/vQnc+TIEfP66693jEt7jTHmtddeMz/72c9MXFycueuuu8yePXsCz917770mJyenSf9//vOfpn///iYuLs7cfvvtZuPGjWGuOHoEM/d9+vQxkq54zJ8/P/yFR7hg/81fjjByfYKd+127dpkRI0YYp9NpbrnlFvP888+bixcvhrnq6BDM3NfV1Zmnn37a9OvXz3Tp0sV4PB7z6KOPmv/+97/hLzyCFRcXN/tzu2Guc3JyzL333nvFmDvvvNPExcWZW265xbz99tshvbbDGNawAACAPRGzZwQAAEQnwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACr/h+L5AG0uTcYHQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X, Y1, \"*\", color='blue')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2215ae03190>]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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/vHjx/MpU6bka9asOeXx119/ff57v/d7A/rmzp2b33zzzRWtcyQqd+xf79ixY3lTU1N+3333VarEEWsoY3/s2LH86quvzv/u7/4uX7p0qSAyROWO/Ve+8pW8vb09P3r0aLVKHJHKHfdbbrklv+666wb0rVixIn/3u99d0TpHurMJIrfffnv+9re/fUDfDTfckC9YsKDs8w37SzNHjx6NZ555JubPn9/fV1dXF/Pnz4/Nmzef8jmbN28ecHxExIIFC057PKc2lLF/vVdffTVee+21GDduXKXKHJGGOvaf+9znYuLEiXHTTTdVo8wRaShj/4Mf/CDmzZsXt9xyS0yaNCne8Y53xBe/+MU4fvx4tcqueUMZ96uvvjqeeeaZ/ss3O3fujEceeSQ+8IEPVKXm0eytfJ8d1l96FxFx8ODBOH78eEyaNGlA/6RJk2L79u2nfM7+/ftPefz+/fsrVudINJSxf71PfvKTMWXKlDf8wjK4oYz9j3/84/ja174W27Ztq0KFI9dQxn7nzp3xL//yL7F48eJ45JFHYseOHfHxj388XnvttVi9enU1yq55Qxn3RYsWxcGDB+M973lP5Hkex44di4997GPxZ3/2Z9UoeVQ73ftsT09P/M///E+ce+65Z/1aw35GhNq1du3a2LhxY3zve9+LxsbG1OWMaIcPH44lS5bEV7/61Rg/fnzqckad3t7emDhxYvzt3/5tdHR0xA033BB33HFHbNiwIXVpI9qTTz4ZX/ziF+Ov//qv49lnn42HHnoofvjDH8bnP//51KVRhmE/IzJ+/Pior6+PAwcODOg/cOBAtLa2nvI5ra2tZR3PqQ1l7PusW7cu1q5dG4899li8613vqmSZI1K5Y//iiy/G7t2744Mf/GB/X29vb0REjBkzJl544YWYOXNmZYseIYbyez958uQ455xzor6+vr/vsssui/3798fRo0ejoaGhojWPBEMZ90996lOxZMmS+KM/+qOIiHjnO98ZR44cieXLl8cdd9wRdXX+rV0pp3ufbW5uLms2JKIGZkQaGhqio6MjHn/88f6+3t7eePzxx2PevHmnfM68efMGHB8R8aMf/ei0x3NqQxn7iIg777wzPv/5z8emTZtizpw51Sh1xCl37C+99NL4+c9/Htu2bevfPvShD8W1114b27Zti7a2tmqWX9OG8nv/7ne/O3bs2NEf/iIifvnLX8bkyZOFkLM0lHF/9dVX3xA2+sJg7mvUKuotfZ8te3lrAhs3bswLhUJ+77335s8991y+fPny/Pzzz8/379+f53meL1myJF+5cmX/8T/5yU/yMWPG5OvWrcuff/75fPXq1W7fHaJyx37t2rV5Q0ND/t3vfjf/9a9/3b8dPnw41Y9Qs8od+9dz18zQlTv2e/bsyZuamvI/+ZM/yV944YX8H//xH/OJEyfmf/EXf5HqR6hJ5Y776tWr86ampvxb3/pWvnPnzvzRRx/NZ86cmV9//fWpfoSadfjw4Xzr1q351q1b84jI77rrrnzr1q15Z2dnnud5vnLlynzJkiX9x/fdvvuJT3wif/755/O77757ZN++m+d5vn79+vyiiy7KGxoa8quuuir/6U9/2v/Y+973vnzp0qUDjv/2t7+dX3zxxXlDQ0P+9re/Pf/hD39Y5YpHjnLGftq0aXlEvGFbvXp19QsfAcr9vT+ZIPLmlDv2Tz31VD537ty8UCjk7e3t+Re+8IX82LFjVa669pUz7q+99lr+mc98Jp85c2be2NiYt7W15R//+Mfz//zP/6x+4TXuiSeeOOXf7r7xXrp0af6+973vDc+5/PLL84aGhry9vT3/+te/PqRzZ3lu/goASGPYrxEBAEYuQQQASEYQAQCSEUQAgGQEEQAgGUEEAEhGEAEAkhFEAIBkBBEAIBlBBABIRhABAJIRRACAZP4PeTPSqQpaDhsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X, Y2, \"*\", color='orange')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Correlation does not imply causation\n",
    "\n",
    "Any discussion about correlation must include the above disclaimer. If two variables $X$ and $Y$ have a strong (or even perfect) correlation, this does not imply that $X$ causes $Y$. To see this simply, note that there is no \"order\" in the equation, and:\n",
    "\n",
    "$corr(X, Y) = \\frac{E[(X-E[X])(Y-E[Y])]}{\\sigma_X \\sigma_Y}$\n",
    "\n",
    "this is equal to:\n",
    "\n",
    "$corr(Y, X) = \\frac{E[(Y-E[Y])(X-E[X])]}{\\sigma_Y \\sigma_X}$\n",
    "\n",
    "At the very least, even *if* there is a causation between $X$ and $Y$ (and we still haven't shown that), we do not know whether $X$ causes $Y$, or if $Y$ causes $X$!\n",
    "\n",
    "\n",
    "There are two main reasons why you get a strong correlation, without having a causation either way.\n",
    "\n",
    "1. There is an underlying factor, let's call it $Z$, that causes both $X$ and $Y$. This may be true even if we do not know, or can't directly measure the values of $Z$. Then $Z$ causes $X$ and $Z$ causes $Y$, and therefore both $X$ and $Y$ \"move together\".\n",
    "2. You simply get \"unlucky\" and the two values *just happen* to have a high correlation, even though they aren't related.\n",
    "\n",
    "Let's have a look at both of these in more detail."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Underlying factors\n",
    "\n",
    "There may be an underlying factor that causes both $X$ and $Y$. A common example here is the following two variables that have a high correlation:\n",
    "\n",
    "1. Ice cream sales\n",
    "2. Deaths by drowning\n",
    "\n",
    "Measuring these two variables indicates a high correlation, so what is going on here? Selling more ice cream does not cause drownings, nor does people drowning sell more ice creams (one would hope). Instead, there is an underlying factor - the weather. If it is hot, ice creams sell more, and people go swimming more, leading to more drownings.\n",
    "\n",
    "In time series data, this is particularly troublesome. For instance, due to inflation, *most things increase in price over time*. Therefore, if you plot the price of two commodities over time, you are likely to get a positive correlation, even if there is no causation between them! More abstractly, if you plot two S&P 500 companies, you are plotting two *successful* companies, and therefore they would correlate strongly simply because they must have been *somewhat successful* to be a top 500 company. This is a form of \"survival bias\".\n",
    "\n",
    "For example, here is the correlation between gold and wheat prices:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "ename": "LimitExceededError",
     "evalue": "(Status 429) (Quandl Error QELx01) You have exceeded the anonymous user limit of 50 calls per day. To make more calls today, please register for a free Nasdaq Data Link account and then include your API key with your requests.",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mLimitExceededError\u001b[0m                        Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[10], line 2\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mquandl\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m gold_price \u001b[38;5;241m=\u001b[39m \u001b[43mquandl\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mLBMA/GOLD\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUSD (AM)\u001b[39m\u001b[38;5;124m'\u001b[39m]\n",
      "File \u001b[1;32mc:\\Python311\\Lib\\site-packages\\quandl\\get.py:48\u001b[0m, in \u001b[0;36mget\u001b[1;34m(dataset, **kwargs)\u001b[0m\n\u001b[0;32m     46\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m dataset_args[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcolumn_index\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m     47\u001b[0m         kwargs\u001b[38;5;241m.\u001b[39mupdate({\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcolumn_index\u001b[39m\u001b[38;5;124m'\u001b[39m: dataset_args[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcolumn_index\u001b[39m\u001b[38;5;124m'\u001b[39m]})\n\u001b[1;32m---> 48\u001b[0m     data \u001b[38;5;241m=\u001b[39m \u001b[43mDataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdataset_args\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mcode\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[43m(\u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhandle_column_not_found\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m     49\u001b[0m \u001b[38;5;66;03m# Array\u001b[39;00m\n\u001b[0;32m     50\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(dataset, \u001b[38;5;28mlist\u001b[39m):\n",
      "File \u001b[1;32mc:\\Python311\\Lib\\site-packages\\quandl\\model\\dataset.py:47\u001b[0m, in \u001b[0;36mDataset.data\u001b[1;34m(self, **options)\u001b[0m\n\u001b[0;32m     45\u001b[0m updated_options \u001b[38;5;241m=\u001b[39m Util\u001b[38;5;241m.\u001b[39mmerge_options(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mparams\u001b[39m\u001b[38;5;124m'\u001b[39m, params, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39moptions)\n\u001b[0;32m     46\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m---> 47\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mData\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mall\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mupdated_options\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     48\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m NotFoundError:\n\u001b[0;32m     49\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m handle_not_found_error:\n",
      "File \u001b[1;32mc:\\Python311\\Lib\\site-packages\\quandl\\operations\\list.py:15\u001b[0m, in \u001b[0;36mListOperation.all\u001b[1;34m(cls, **options)\u001b[0m\n\u001b[0;32m     13\u001b[0m     options[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mparams\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m     14\u001b[0m path \u001b[38;5;241m=\u001b[39m Util\u001b[38;5;241m.\u001b[39mconstructed_path(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mlist_path(), options[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mparams\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m---> 15\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43mConnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mget\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     16\u001b[0m response_data \u001b[38;5;241m=\u001b[39m r\u001b[38;5;241m.\u001b[39mjson()\n\u001b[0;32m     17\u001b[0m Util\u001b[38;5;241m.\u001b[39mconvert_to_dates(response_data)\n",
      "File \u001b[1;32mc:\\Python311\\Lib\\site-packages\\quandl\\connection.py:38\u001b[0m, in \u001b[0;36mConnection.request\u001b[1;34m(cls, http_verb, url, **options)\u001b[0m\n\u001b[0;32m     34\u001b[0m options[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mheaders\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m headers\n\u001b[0;32m     36\u001b[0m abs_url \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (ApiConfig\u001b[38;5;241m.\u001b[39mapi_base, url)\n\u001b[1;32m---> 38\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhttp_verb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mabs_url\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[1;32mc:\\Python311\\Lib\\site-packages\\quandl\\connection.py:50\u001b[0m, in \u001b[0;36mConnection.execute_request\u001b[1;34m(cls, http_verb, url, **options)\u001b[0m\n\u001b[0;32m     45\u001b[0m response \u001b[38;5;241m=\u001b[39m session\u001b[38;5;241m.\u001b[39mrequest(method\u001b[38;5;241m=\u001b[39mhttp_verb,\n\u001b[0;32m     46\u001b[0m                            url\u001b[38;5;241m=\u001b[39murl,\n\u001b[0;32m     47\u001b[0m                            verify\u001b[38;5;241m=\u001b[39mApiConfig\u001b[38;5;241m.\u001b[39mverify_ssl,\n\u001b[0;32m     48\u001b[0m                            \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39moptions)\n\u001b[0;32m     49\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m200\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m300\u001b[39m:\n\u001b[1;32m---> 50\u001b[0m     \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_api_error\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     51\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m     52\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m response\n",
      "File \u001b[1;32mc:\\Python311\\Lib\\site-packages\\quandl\\connection.py:114\u001b[0m, in \u001b[0;36mConnection.handle_api_error\u001b[1;34m(cls, resp)\u001b[0m\n\u001b[0;32m    103\u001b[0m d_klass \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m    104\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL\u001b[39m\u001b[38;5;124m'\u001b[39m: LimitExceededError,\n\u001b[0;32m    105\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mM\u001b[39m\u001b[38;5;124m'\u001b[39m: InternalServerError,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    110\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mX\u001b[39m\u001b[38;5;124m'\u001b[39m: ServiceUnavailableError\n\u001b[0;32m    111\u001b[0m }\n\u001b[0;32m    112\u001b[0m klass \u001b[38;5;241m=\u001b[39m d_klass\u001b[38;5;241m.\u001b[39mget(code_letter, QuandlError)\n\u001b[1;32m--> 114\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m klass(message, resp\u001b[38;5;241m.\u001b[39mstatus_code, resp\u001b[38;5;241m.\u001b[39mtext, resp\u001b[38;5;241m.\u001b[39mheaders, code)\n",
      "\u001b[1;31mLimitExceededError\u001b[0m: (Status 429) (Quandl Error QELx01) You have exceeded the anonymous user limit of 50 calls per day. To make more calls today, please register for a free Nasdaq Data Link account and then include your API key with your requests."
     ]
    }
   ],
   "source": [
    "import quandl\n",
    "gold_price = quandl.get(\"LBMA/GOLD\")['USD (AM)']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Date\n",
       "1968-01-02    35.18\n",
       "1968-01-03    35.16\n",
       "1968-01-04    35.14\n",
       "1968-01-05    35.14\n",
       "1968-01-08    35.14\n",
       "Name: USD (AM), dtype: float64"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gold_price.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "wheat_futures = quandl.get(\"CHRIS/MGEX_IH1\")['Last']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Date\n",
       "2005-01-03    321.00\n",
       "2005-01-04    318.00\n",
       "2005-01-05    319.25\n",
       "2005-01-06    328.00\n",
       "2005-01-07    329.50\n",
       "Name: Last, dtype: float64"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wheat_futures.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>gold</th>\n",
       "      <th>wheat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>2005-01-04</td>\n",
       "      <td>426.80</td>\n",
       "      <td>318.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2005-01-05</td>\n",
       "      <td>425.50</td>\n",
       "      <td>319.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2005-01-06</td>\n",
       "      <td>425.80</td>\n",
       "      <td>328.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2005-01-07</td>\n",
       "      <td>423.15</td>\n",
       "      <td>329.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2005-01-10</td>\n",
       "      <td>421.25</td>\n",
       "      <td>327.50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              gold   wheat\n",
       "Date                      \n",
       "2005-01-04  426.80  318.00\n",
       "2005-01-05  425.50  319.25\n",
       "2005-01-06  425.80  328.00\n",
       "2005-01-07  423.15  329.50\n",
       "2005-01-10  421.25  327.50"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prices = pd.DataFrame({\"gold\": gold_price, \"wheat\": wheat_futures})\n",
    "prices.dropna(inplace=True)  # Drop rows where we don't have both gold and wheat\n",
    "prices.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1e3bb15f448>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "prices.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>gold</th>\n",
       "      <th>wheat</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>gold</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.339939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>wheat</td>\n",
       "      <td>0.339939</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           gold     wheat\n",
       "gold   1.000000  0.339939\n",
       "wheat  0.339939  1.000000"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prices.corr()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, the correlation between wheat and gold is a positive correlation. However, there is no impactful causation here - the price of gold would not directly affect the price of wheat. Gold is more reliant on economic factors, such as an unstable market may drive people to buy gold as a safer investment. Wheat is more reliant on factors like weather, which determine supply. To oversimplify, good weather causes more supply, leading to reduced prices.\n",
    "\n",
    "There *are* underlying factors that affect both. Financial markets do affect both prices, as does other factors like international instability. However, the main factor is simply inflation.\n",
    "\n",
    "We will cover, in great detail, how to determine correlation in time series. The short and simple version, however, is simply to *detrend* the data. In other words, look for the underlying trend and remove it from the data. Then compute the correlation between the detrended data.\n",
    "\n",
    "A simple detrending concept is to fit a linear model (i.e. $y= ax + b$) and then subtract the model's predicted value from the actual value. This leaves over the residue, or error, of the model, and we compute the correlation of those. A strong correlation in that case is much more significant (although, still not a causation)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise\n",
    "\n",
    "Remove the trend from the wheat and gold data above, and compute the correlation of the detrended data.\n",
    "\n",
    "A good function to use is `scipy.signal.detrend`, although if you have a preferred means of computing a linear model from data (for instance, using statsmodels), feel free to use that."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>gold_detrended</th>\n",
       "      <th>wheat_detrended</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>gold_detrended</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.642194</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>wheat_detrended</td>\n",
       "      <td>0.642194</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 gold_detrended  wheat_detrended\n",
       "gold_detrended         1.000000         0.642194\n",
       "wheat_detrended        0.642194         1.000000"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy.signal import detrend\n",
    "\n",
    "prices['gold_detrended'] = detrend(prices['gold'])\n",
    "prices['wheat_detrended'] = detrend(prices['wheat'])\n",
    "prices[['gold_detrended', 'wheat_detrended']].plot()\n",
    "\n",
    "prices[['gold_detrended', 'wheat_detrended']].corr()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*For solutions, see `solutions/detrending.py`*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Random correlation\n",
    "\n",
    "While generally unlikely in a single experiment, two variables may be correlated for no reason other than *random chance*. This is less likely with larger datasets.\n",
    "\n",
    "However, one factor that *increases* the chance of getting a randomly high correlation is the large number of experiments that we run on a daily instance. Consider a machine learning algorithm that compares dozens of lag periods across thousands of stocks. *At least some* of these will have high correlations that are meaningless and produce no actionable outcome.\n",
    "\n",
    "To show this in action, here is a simple experiment, performed once. We create two random sets of data, and compute the correlation. If it is above 0.8, we say we \"found a high correlation\". It is unlikely that the following cell actually does so. Most of the time (for a very high value of \"most\") you will get a correlation close to zero."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Correlation is: 0.01656030288357531\n",
      "Did not find a high correlation\n"
     ]
    }
   ],
   "source": [
    "n_datapoints = 20\n",
    "x_random = np.random.random(n_datapoints)\n",
    "y_random = np.random.random(n_datapoints)\n",
    "\n",
    "corr = np.corrcoef(x_random, y_random)[0, 1]\n",
    "\n",
    "print(\"Correlation is:\", corr)\n",
    "if corr > 0.8:\n",
    "    print(\"Found a high correlation\")\n",
    "else:\n",
    "    print(\"Did not find a high correlation\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In practice, we never run just one experiment, and a new factor to consider in running experiments with computers is the appeal of being able to run *millions* of experiments:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_experiment(n_datapoints=20):\n",
    "    # Note that all data here is randomly chosen\n",
    "    x_random = np.random.random(n_datapoints)\n",
    "    y_random = np.random.random(n_datapoints)\n",
    "    corr = np.corrcoef(x_random, y_random)[0,1]\n",
    "    return corr > 0.8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found a correlation on experiment 6792!\n",
      "Finished running experiments\n"
     ]
    }
   ],
   "source": [
    "n_experiments = 100000  # Change to 10000, but this will take a while to run\n",
    "\n",
    "for i in range(n_experiments):\n",
    "    if run_experiment():\n",
    "        print(\"Found a correlation on experiment {}!\".format(i))\n",
    "print(\"Finished running experiments\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercises\n",
    "\n",
    "There are two factors that affect how many of these *false positive* results we get - in other words, correlations that just happen to be high by chance. The two factors are:\n",
    "\n",
    "1) How much data you have\n",
    "2) The level at which a correlation is considered \"high\", i.e. the 0.8 in the above code.\n",
    "\n",
    "Plot the relationship between these two factors, and the percentage of false positives in running your experiments. Note you might need a log scale on one or both of your axis to properly visualise the results.\n",
    "\n",
    "Use `np.logspace` to produce a log scale for the number of datapoints.\n",
    "\n",
    "Write a snippet of code that generates a graph showing the relationship between how many data points you have, and the percentage of false positives (FP) you get. Generate another graph showing the relationship between the \"high\" correlation level and the FP rate.\n",
    "\n",
    "**Hint - writing better code**\n",
    "\n",
    "To make your code more manageable and easier to read, encapsulate your behaviour into functions. In other words, take your code, and write small functions that do that one thing. Have the function accept different parameters that you can pass. As an example, if we wanted to run two sets of experiments of different sizes, we can do this:\n",
    "\n",
    "```\n",
    "for i in range(10000):\n",
    "    run_experiment()\n",
    "    \n",
    "for j in range(1000):\n",
    "    run_experiment()\n",
    "\n",
    "```\n",
    "\n",
    "or, you can parameterise the number of experiments and pass that as a function:\n",
    "\n",
    "```\n",
    "def run_many_experiments(n_experiments):\n",
    "    for i in range(n_experiments):\n",
    "        run_experiment()\n",
    "        \n",
    "run_many_experiments(100000)\n",
    "run_many_experiments(1000)\n",
    "```\n",
    "\n",
    "The second case results in less duplicated code (duplicate code can cause bugs), and is easier to manage. You take the complexity of \"running multiple experiments\", and hide/encapsulate that into the function `run_many_experiments`. This hides the complexity for later users of your code.\n",
    "\n",
    "**Hint** This code, may take a while to compute when completed. You can estimate this by using the following profiling code to test how long *one* iteration takes, and then use that to estimate how long the full process will take."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[96], line 8\u001b[0m\n\u001b[0;32m      5\u001b[0m     time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m0.05\u001b[39m)\n\u001b[0;32m      6\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m----> 8\u001b[0m \u001b[43mget_ipython\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_line_magic\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtimeit\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmy_function()\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\IPython\\core\\interactiveshell.py:2369\u001b[0m, in \u001b[0;36mInteractiveShell.run_line_magic\u001b[1;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[0;32m   2367\u001b[0m     kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlocal_ns\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_local_scope(stack_depth)\n\u001b[0;32m   2368\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuiltin_trap:\n\u001b[1;32m-> 2369\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   2371\u001b[0m \u001b[38;5;66;03m# The code below prevents the output from being displayed\u001b[39;00m\n\u001b[0;32m   2372\u001b[0m \u001b[38;5;66;03m# when using magics with decodator @output_can_be_silenced\u001b[39;00m\n\u001b[0;32m   2373\u001b[0m \u001b[38;5;66;03m# when the last Python token in the expression is a ';'.\u001b[39;00m\n\u001b[0;32m   2374\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(fn, magic\u001b[38;5;241m.\u001b[39mMAGIC_OUTPUT_CAN_BE_SILENCED, \u001b[38;5;28;01mFalse\u001b[39;00m):\n",
      "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\IPython\\core\\magics\\execution.py:1167\u001b[0m, in \u001b[0;36mExecutionMagics.timeit\u001b[1;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[0;32m   1164\u001b[0m         \u001b[38;5;28;01mif\u001b[39;00m time_number \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.2\u001b[39m:\n\u001b[0;32m   1165\u001b[0m             \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m-> 1167\u001b[0m all_runs \u001b[38;5;241m=\u001b[39m \u001b[43mtimer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrepeat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrepeat\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnumber\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   1168\u001b[0m best \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmin\u001b[39m(all_runs) \u001b[38;5;241m/\u001b[39m number\n\u001b[0;32m   1169\u001b[0m worst \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmax\u001b[39m(all_runs) \u001b[38;5;241m/\u001b[39m number\n",
      "File \u001b[1;32mc:\\Python311\\Lib\\timeit.py:206\u001b[0m, in \u001b[0;36mTimer.repeat\u001b[1;34m(self, repeat, number)\u001b[0m\n\u001b[0;32m    204\u001b[0m r \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m    205\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(repeat):\n\u001b[1;32m--> 206\u001b[0m     t \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumber\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    207\u001b[0m     r\u001b[38;5;241m.\u001b[39mappend(t)\n\u001b[0;32m    208\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m r\n",
      "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\IPython\\core\\magics\\execution.py:157\u001b[0m, in \u001b[0;36mTimer.timeit\u001b[1;34m(self, number)\u001b[0m\n\u001b[0;32m    155\u001b[0m gc\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[0;32m    156\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 157\u001b[0m     timing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minner\u001b[49m\u001b[43m(\u001b[49m\u001b[43mit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    158\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m    159\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m gcold:\n",
      "File \u001b[1;32m<magic-timeit>:1\u001b[0m, in \u001b[0;36minner\u001b[1;34m(_it, _timer)\u001b[0m\n",
      "Cell \u001b[1;32mIn[96], line 5\u001b[0m, in \u001b[0;36mmy_function\u001b[1;34m()\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmy_function\u001b[39m():\n\u001b[0;32m      4\u001b[0m     \u001b[38;5;66;03m# Replace with your code\u001b[39;00m\n\u001b[1;32m----> 5\u001b[0m     time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m0.05\u001b[39m)\n\u001b[0;32m      6\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "def my_function():\n",
    "    \n",
    "    time.sleep(0.05)\n",
    "    return\n",
    "\n",
    "%timeit my_function()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\User\\AppData\\Local\\Temp\\ipykernel_1544\\436155628.py:18: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.\n",
      "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n",
      "  data_size = np.logspace(1, 6, 6, dtype=np.int)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x221190ad650>]"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGzCAYAAAAMr0ziAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqhUlEQVR4nO3df3RU9Z3/8dckITOKJCo5ZAiNBhAISkxqICGIS1lnHVpWTd3WSFtIs1S3LVLWtFQSkeiijbrGxS3Z5mBBcI8YNruaYyGbgmnZqoyyJOGrrIC/DQVnQmrNYFwTyNzvHx7HHRkgN5LkM+H5OOcezWfenzvvz0d0Xt7cmXFYlmUJAADAYHFD3QAAAMCZEFgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPH6FViqq6uVkZEhl8ul/Px87d69+7T1dXV1yszMlMvlUlZWlhoaGiIedzgcUY9//Md/7E97AABgmLEdWLZs2aLS0lJVVFSopaVF2dnZ8nq9am9vj1q/a9cuLViwQIsXL1Zra6sKCwtVWFioffv2hWvef//9iGPDhg1yOBz6m7/5m/6vDAAADBsOu19+mJ+frxkzZmjt2rWSpFAopPT0dC1dulQrVqw4qb6oqEhdXV3aunVreGzmzJnKyclRTU1N1OcoLCzUsWPH1NTU1KeeQqGQjhw5olGjRsnhcNhZDgAAGCKWZenYsWNKS0tTXNzpr6Ek2DlxT0+PmpubVVZWFh6Li4uTx+ORz+eLOsfn86m0tDRizOv1qr6+Pmp9IBDQtm3btGnTplP20d3dre7u7vDPhw8f1uWXX25jJQAAwBSHDh3SV77yldPW2AosHR0d6u3tVWpqasR4amqqDhw4EHWO3++PWu/3+6PWb9q0SaNGjdJNN910yj4qKyt17733njR+6NAhJSUlnWkZAADAAMFgUOnp6Ro1atQZa20FlsGwYcMGffe735XL5TplTVlZWcRVm88WnJSURGABACDG9OV2DluBJSUlRfHx8QoEAhHjgUBAbrc76hy3293n+ueff14HDx7Uli1bTtuH0+mU0+m00zoAAIhhtt4llJiYqNzc3IibYUOhkJqamlRQUBB1TkFBwUk3z+7YsSNq/fr165Wbm6vs7Gw7bQEAgGHO9q+ESktLVVxcrOnTpysvL09r1qxRV1eXSkpKJEmLFi3SuHHjVFlZKUlatmyZ5syZo6qqKs2fP1+1tbXas2eP1q1bF3HeYDCouro6VVVVnYVlAQCA4cR2YCkqKtLRo0e1atUq+f1+5eTkqLGxMXxjbVtbW8Rbk2bNmqXNmzdr5cqVKi8v16RJk1RfX69p06ZFnLe2tlaWZWnBggVfckkAAGC4sf05LCYKBoNKTk5WZ2cnN90CABAj7Lx+811CAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVhO43hvSN/79cv63q9f1sc9J4a6HQAAzlnGfVuzSSxLeuHNDknSiVDMf74eAAAxiyssAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8DSR5Y11B0AAHDuIrAAAADj9SuwVFdXKyMjQy6XS/n5+dq9e/dp6+vq6pSZmSmXy6WsrCw1NDScVLN//37dcMMNSk5O1siRIzVjxgy1tbX1pz0AADDM2A4sW7ZsUWlpqSoqKtTS0qLs7Gx5vV61t7dHrd+1a5cWLFigxYsXq7W1VYWFhSosLNS+ffvCNW+99ZZmz56tzMxM7dy5U6+88oruvvtuuVyu/q8MAAAMGw7Lsnd3Rn5+vmbMmKG1a9dKkkKhkNLT07V06VKtWLHipPqioiJ1dXVp69at4bGZM2cqJydHNTU1kqRbbrlFI0aM0L/+67/2axHBYFDJycnq7OxUUlJSv84RzfHekCbd9Z+SpP9XcZ2Szxtx1s4NAMC5zs7rt60rLD09PWpubpbH4/n8BHFx8ng88vl8Uef4fL6Ieknyer3h+lAopG3btmny5Mnyer0aM2aM8vPzVV9ff8o+uru7FQwGIw4AADB82QosHR0d6u3tVWpqasR4amqq/H5/1Dl+v/+09e3t7froo4/0wAMPaN68edq+fbu++c1v6qabbtJ//dd/RT1nZWWlkpOTw0d6erqdZQAAgBgz5O8SCoVCkqQbb7xRd9xxh3JycrRixQr99V//dfhXRl9UVlamzs7O8HHo0KHBbBkAAAyyBDvFKSkpio+PVyAQiBgPBAJyu91R57jd7tPWp6SkKCEhQZdffnlEzdSpU/XCCy9EPafT6ZTT6bTTOgAAiGG2rrAkJiYqNzdXTU1N4bFQKKSmpiYVFBREnVNQUBBRL0k7duwI1ycmJmrGjBk6ePBgRM3rr7+uSy+91E57AABgmLJ1hUWSSktLVVxcrOnTpysvL09r1qxRV1eXSkpKJEmLFi3SuHHjVFlZKUlatmyZ5syZo6qqKs2fP1+1tbXas2eP1q1bFz7n8uXLVVRUpL/4i7/Q3Llz1djYqN/85jfauXPn2VklAACIabYDS1FRkY4ePapVq1bJ7/crJydHjY2N4Rtr29raFBf3+YWbWbNmafPmzVq5cqXKy8s1adIk1dfXa9q0aeGab37zm6qpqVFlZaV+8pOfaMqUKfqP//gPzZ49+ywsEQAAxDrbn8NiIj6HBQCA2DNgn8MCAAAwFAgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgElr6yhroBAADOXQQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVhOwzHUDQAAAEkEFgAAEAMILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYr1+Bpbq6WhkZGXK5XMrPz9fu3btPW19XV6fMzEy5XC5lZWWpoaEh4vHvf//7cjgcEce8efP60xoAABiGbAeWLVu2qLS0VBUVFWppaVF2dra8Xq/a29uj1u/atUsLFizQ4sWL1draqsLCQhUWFmrfvn0RdfPmzdP7778fPp566qn+rQgAAAw7tgPLI488oltvvVUlJSW6/PLLVVNTo/PPP18bNmyIWv/oo49q3rx5Wr58uaZOnarVq1frqquu0tq1ayPqnE6n3G53+Ljooov6tyIAADDs2AosPT09am5ulsfj+fwEcXHyeDzy+XxR5/h8voh6SfJ6vSfV79y5U2PGjNGUKVP0ox/9SH/605/stAYAAIaxBDvFHR0d6u3tVWpqasR4amqqDhw4EHWO3++PWu/3+8M/z5s3TzfddJPGjx+vt956S+Xl5fr6178un8+n+Pj4k87Z3d2t7u7u8M/BYNDOMgAAQIyxFVgGyi233BL++6ysLF155ZWaOHGidu7cqWuvvfak+srKSt17772D2SIAABhCtn4llJKSovj4eAUCgYjxQCAgt9sddY7b7bZVL0kTJkxQSkqK3nzzzaiPl5WVqbOzM3wcOnTIzjIAAECMsRVYEhMTlZubq6ampvBYKBRSU1OTCgoKos4pKCiIqJekHTt2nLJekv74xz/qT3/6k8aOHRv1cafTqaSkpIgDAAAMX7bfJVRaWqrHHntMmzZt0v79+/WjH/1IXV1dKikpkSQtWrRIZWVl4fply5apsbFRVVVVOnDggO655x7t2bNHt99+uyTpo48+0vLly/XSSy/p3XffVVNTk2688UZddtll8nq9Z2mZAAAgltm+h6WoqEhHjx7VqlWr5Pf7lZOTo8bGxvCNtW1tbYqL+zwHzZo1S5s3b9bKlStVXl6uSZMmqb6+XtOmTZMkxcfH65VXXtGmTZv04YcfKi0tTdddd51Wr14tp9N5lpYJAABimcOyLGuom/iygsGgkpOT1dnZeVZ/PXSiN6TL7vpPSdLeVX+lC89PPGvnBgDgXGfn9ZvvEgIAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwnIbD4RjqFgAAgAgsAAAgBhBYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgElj6yrKHuAACAcxeBBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYr1+Bpbq6WhkZGXK5XMrPz9fu3btPW19XV6fMzEy5XC5lZWWpoaHhlLU//OEP5XA4tGbNmv60BgAAhiHbgWXLli0qLS1VRUWFWlpalJ2dLa/Xq/b29qj1u3bt0oIFC7R48WK1traqsLBQhYWF2rdv30m1zzzzjF566SWlpaXZXwkAABi2bAeWRx55RLfeeqtKSkp0+eWXq6amRueff742bNgQtf7RRx/VvHnztHz5ck2dOlWrV6/WVVddpbVr10bUHT58WEuXLtWTTz6pESNG9G81AABgWLIVWHp6etTc3CyPx/P5CeLi5PF45PP5os7x+XwR9ZLk9Xoj6kOhkBYuXKjly5friiuusNMSAAA4ByTYKe7o6FBvb69SU1MjxlNTU3XgwIGoc/x+f9R6v98f/vnBBx9UQkKCfvKTn/Spj+7ubnV3d4d/DgaDfV2CLY4BOSsAALBryN8l1NzcrEcffVQbN26Uw9G3iFBZWank5OTwkZ6ePsBdAgCAoWQrsKSkpCg+Pl6BQCBiPBAIyO12R53jdrtPW//888+rvb1dl1xyiRISEpSQkKD33ntPP/3pT5WRkRH1nGVlZers7Awfhw4dsrMMAAAQY2wFlsTEROXm5qqpqSk8FgqF1NTUpIKCgqhzCgoKIuolaceOHeH6hQsX6pVXXtHevXvDR1pampYvX67f/va3Uc/pdDqVlJQUcQAAgOHL1j0sklRaWqri4mJNnz5deXl5WrNmjbq6ulRSUiJJWrRokcaNG6fKykpJ0rJlyzRnzhxVVVVp/vz5qq2t1Z49e7Ru3TpJ0ujRozV69OiI5xgxYoTcbremTJnyZdcHAACGAduBpaioSEePHtWqVavk9/uVk5OjxsbG8I21bW1tiov7/MLNrFmztHnzZq1cuVLl5eWaNGmS6uvrNW3atLO3CgAAMKw5LMuyhrqJLysYDCo5OVmdnZ1n9ddDoZClCeWffipv691/pYtGJp61cwMAcK6z8/o95O8SAgAAOBMCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoGlj2L++wsAAIhhBBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8Qgsp+FwDHUHAABAIrAAAIAYQGABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHj9CizV1dXKyMiQy+VSfn6+du/efdr6uro6ZWZmyuVyKSsrSw0NDRGP33PPPcrMzNTIkSN10UUXyePx6OWXX+5PawAAYBiyHVi2bNmi0tJSVVRUqKWlRdnZ2fJ6vWpvb49av2vXLi1YsECLFy9Wa2urCgsLVVhYqH379oVrJk+erLVr1+rVV1/VCy+8oIyMDF133XU6evRo/1d2llmWNdQtAABwznJYNl+J8/PzNWPGDK1du1aSFAqFlJ6erqVLl2rFihUn1RcVFamrq0tbt24Nj82cOVM5OTmqqamJ+hzBYFDJycl67rnndO21156xp8/qOzs7lZSUZGc5p2VZlsaXfXo1qHmlR6MvcJ61cwMAcK6z8/pt6wpLT0+Pmpub5fF4Pj9BXJw8Ho98Pl/UOT6fL6Jekrxe7ynre3p6tG7dOiUnJys7OztqTXd3t4LBYMQBAACGL1uBpaOjQ729vUpNTY0YT01Nld/vjzrH7/f3qX7r1q264IIL5HK59E//9E/asWOHUlJSop6zsrJSycnJ4SM9Pd3OMgAAQIwx5l1Cc+fO1d69e7Vr1y7NmzdPN9988ynviykrK1NnZ2f4OHTo0CB3CwAABpOtwJKSkqL4+HgFAoGI8UAgILfbHXWO2+3uU/3IkSN12WWXaebMmVq/fr0SEhK0fv36qOd0Op1KSkqKOAAAwPBlK7AkJiYqNzdXTU1N4bFQKKSmpiYVFBREnVNQUBBRL0k7duw4Zf3/PW93d7ed9gAAwDCVYHdCaWmpiouLNX36dOXl5WnNmjXq6upSSUmJJGnRokUaN26cKisrJUnLli3TnDlzVFVVpfnz56u2tlZ79uzRunXrJEldXV26//77dcMNN2js2LHq6OhQdXW1Dh8+rG9/+9tncakAACBW2Q4sRUVFOnr0qFatWiW/36+cnBw1NjaGb6xta2tTXNznF25mzZqlzZs3a+XKlSovL9ekSZNUX1+vadOmSZLi4+N14MABbdq0SR0dHRo9erRmzJih559/XldcccVZWiYAAIhltj+HxUR8DgsAALFnwD6HBQAAYCgQWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYTsPhcAx1CwAAQAQWAAAQAwgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BJY+soa6AQAAzmEEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADBevwJLdXW1MjIy5HK5lJ+fr927d5+2vq6uTpmZmXK5XMrKylJDQ0P4sePHj+vOO+9UVlaWRo4cqbS0NC1atEhHjhzpT2sAAGAYsh1YtmzZotLSUlVUVKilpUXZ2dnyer1qb2+PWr9r1y4tWLBAixcvVmtrqwoLC1VYWKh9+/ZJkj7++GO1tLTo7rvvVktLi55++mkdPHhQN9xww5dbGQAAGDYclmVZdibk5+drxowZWrt2rSQpFAopPT1dS5cu1YoVK06qLyoqUldXl7Zu3RoemzlzpnJyclRTUxP1Of77v/9beXl5eu+993TJJZecsadgMKjk5GR1dnYqKSnJznLOKGPFNknSnpUepVzgPKvnBgDgXGbn9dvWFZaenh41NzfL4/F8foK4OHk8Hvl8vqhzfD5fRL0keb3eU9ZLUmdnpxwOhy688MKoj3d3dysYDEYcAABg+LIVWDo6OtTb26vU1NSI8dTUVPn9/qhz/H6/rfpPPvlEd955pxYsWHDKtFVZWank5OTwkZ6ebmcZAAAgxhj1LqHjx4/r5ptvlmVZ+tWvfnXKurKyMnV2doaPQ4cODWKXAABgsCXYKU5JSVF8fLwCgUDEeCAQkNvtjjrH7Xb3qf6zsPLee+/pd7/73Wl/l+V0OuV0cj8JAADnCltXWBITE5Wbm6umpqbwWCgUUlNTkwoKCqLOKSgoiKiXpB07dkTUfxZW3njjDT333HMaPXq0nbYAAMAwZ+sKiySVlpaquLhY06dPV15entasWaOuri6VlJRIkhYtWqRx48apsrJSkrRs2TLNmTNHVVVVmj9/vmpra7Vnzx6tW7dO0qdh5Vvf+pZaWlq0detW9fb2hu9vufjii5WYmHi21goAAGKU7cBSVFSko0ePatWqVfL7/crJyVFjY2P4xtq2tjbFxX1+4WbWrFnavHmzVq5cqfLyck2aNEn19fWaNm2aJOnw4cN69tlnJUk5OTkRz/X73/9eX/va1/q5NAAAMFzY/hwWE/E5LAAAxJ4B+xwWAACAoUBg6aPYvw4FAEDsIrAAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7CcgcMx1B0AAAACCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFY+siSNdQtAABwziKwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYr1+Bpbq6WhkZGXK5XMrPz9fu3btPW19XV6fMzEy5XC5lZWWpoaEh4vGnn35a1113nUaPHi2Hw6G9e/f2py0AADBM2Q4sW7ZsUWlpqSoqKtTS0qLs7Gx5vV61t7dHrd+1a5cWLFigxYsXq7W1VYWFhSosLNS+ffvCNV1dXZo9e7YefPDB/q8EAAAMWw7Lsmx9Ilp+fr5mzJihtWvXSpJCoZDS09O1dOlSrVix4qT6oqIidXV1aevWreGxmTNnKicnRzU1NRG17777rsaPH6/W1lbl5OT0uadgMKjk5GR1dnYqKSnJznLOaHzZNlmWtPuuazVmlOusnhsAgHOZnddvW1dYenp61NzcLI/H8/kJ4uLk8Xjk8/mizvH5fBH1kuT1ek9Z3xfd3d0KBoMRBwAAGL5sBZaOjg719vYqNTU1Yjw1NVV+vz/qHL/fb6u+LyorK5WcnBw+0tPT+30uAABgvph8l1BZWZk6OzvDx6FDh4a6JQAAMIAS7BSnpKQoPj5egUAgYjwQCMjtdked43a7bdX3hdPplNPp7Pd8AAAQW2xdYUlMTFRubq6amprCY6FQSE1NTSooKIg6p6CgIKJeknbs2HHKegAAgC+ydYVFkkpLS1VcXKzp06crLy9Pa9asUVdXl0pKSiRJixYt0rhx41RZWSlJWrZsmebMmaOqqirNnz9ftbW12rNnj9atWxc+5wcffKC2tjYdOXJEknTw4EFJn16d+TJXYgAAwPBgO7AUFRXp6NGjWrVqlfx+v3JyctTY2Bi+sbatrU1xcZ9fuJk1a5Y2b96slStXqry8XJMmTVJ9fb2mTZsWrnn22WfDgUeSbrnlFklSRUWF7rnnnv6uDQAADBO2P4fFRHwOCwAAsWfAPocFAABgKBBYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCxn4BjqBgAAAIEFAACYj8DSVzH/FZEAAMQuAgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABivX4GlurpaGRkZcrlcys/P1+7du09bX1dXp8zMTLlcLmVlZamhoSHiccuytGrVKo0dO1bnnXeePB6P3njjjf60BgAAhiHbgWXLli0qLS1VRUWFWlpalJ2dLa/Xq/b29qj1u3bt0oIFC7R48WK1traqsLBQhYWF2rdvX7jmoYce0j//8z+rpqZGL7/8skaOHCmv16tPPvmk/ysDAADDhsOyLMvOhPz8fM2YMUNr166VJIVCIaWnp2vp0qVasWLFSfVFRUXq6urS1q1bw2MzZ85UTk6OampqZFmW0tLS9NOf/lQ/+9nPJEmdnZ1KTU3Vxo0bdcstt5yxp2AwqOTkZHV2diopKcnOcs5oQtk2hSxpd/m1GpPkOqvnBgDgXGbn9TvBzol7enrU3NyssrKy8FhcXJw8Ho98Pl/UOT6fT6WlpRFjXq9X9fX1kqR33nlHfr9fHo8n/HhycrLy8/Pl8/miBpbu7m51d3eHfw4Gg3aW0S/fW/+yxowisAAAzk0J8Q5tLMkbuue3U9zR0aHe3l6lpqZGjKempurAgQNR5/j9/qj1fr8//PhnY6eq+aLKykrde++9dlrvtzGjXPIHP9HrgY/0euCjQXlOAABMk5gwtO/TsRVYTFFWVhZx1SYYDCo9PX1AnqvuhwVqafvzgJwbAIBY4XA4hvT5bQWWlJQUxcfHKxAIRIwHAgG53e6oc9xu92nrP/trIBDQ2LFjI2pycnKintPpdMrpdNppvd/SLz5f6RefPyjPBQAAorN1fScxMVG5ublqamoKj4VCITU1NamgoCDqnIKCgoh6SdqxY0e4fvz48XK73RE1wWBQL7/88inPCQAAzi22fyVUWlqq4uJiTZ8+XXl5eVqzZo26urpUUlIiSVq0aJHGjRunyspKSdKyZcs0Z84cVVVVaf78+aqtrdWePXu0bt06SZ9eYvr7v/973XfffZo0aZLGjx+vu+++W2lpaSosLDx7KwUAADHLdmApKirS0aNHtWrVKvn9fuXk5KixsTF802xbW5vi4j6/cDNr1ixt3rxZK1euVHl5uSZNmqT6+npNmzYtXPPzn/9cXV1duu222/Thhx9q9uzZamxslMvFu3IAAEA/PofFRAP5OSwAAGBg2Hn95ruEAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxbH80v4k++7DeYDA4xJ0AAIC++ux1uy8fuj8sAsuxY8ckSenp6UPcCQAAsOvYsWNKTk4+bc2w+C6hUCikI0eOaNSoUXI4HGf13MFgUOnp6Tp06BDfUzSA2OfBwT4PHvZ6cLDPg2Og9tmyLB07dkxpaWkRX5wczbC4whIXF6evfOUrA/ocSUlJ/MswCNjnwcE+Dx72enCwz4NjIPb5TFdWPsNNtwAAwHgEFgAAYDwCyxk4nU5VVFTI6XQOdSvDGvs8ONjnwcNeDw72eXCYsM/D4qZbAAAwvHGFBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYJFVXVysjI0Mul0v5+fnavXv3aevr6uqUmZkpl8ulrKwsNTQ0DFKnsc3OPj/22GO65pprdNFFF+miiy6Sx+M54z8XfMrun+fP1NbWyuFwqLCwcGAbHCbs7vOHH36oJUuWaOzYsXI6nZo8eTL/7egju3u9Zs0aTZkyReedd57S09N1xx136JNPPhmkbmPPH/7wB11//fVKS0uTw+FQfX39Gefs3LlTV111lZxOpy677DJt3LhxwPuUdY6rra21EhMTrQ0bNlj/8z//Y916663WhRdeaAUCgaj1L774ohUfH2899NBD1muvvWatXLnSGjFihPXqq68Ocuexxe4+f+c737Gqq6ut1tZWa//+/db3v/99Kzk52frjH/84yJ3HFrv7/Jl33nnHGjdunHXNNddYN9544+A0G8Ps7nN3d7c1ffp06xvf+Ib1wgsvWO+88461c+dOa+/evYPceeyxu9dPPvmk5XQ6rSeffNJ65513rN/+9rfW2LFjrTvuuGOQO48dDQ0N1l133WU9/fTTliTrmWeeOW3922+/bZ1//vlWaWmp9dprr1m//OUvrfj4eKuxsXFA+zznA0teXp61ZMmS8M+9vb1WWlqaVVlZGbX+5ptvtubPnx8xlp+fb/3d3/3dgPYZ6+zu8xedOHHCGjVqlLVp06aBanFY6M8+nzhxwpo1a5b161//2iouLiaw9IHdff7Vr35lTZgwwerp6RmsFocNu3u9ZMkS6y//8i8jxkpLS62rr756QPscLvoSWH7+859bV1xxRcRYUVGR5fV6B7AzyzqnfyXU09Oj5uZmeTye8FhcXJw8Ho98Pl/UOT6fL6Jekrxe7ynr0b99/qKPP/5Yx48f18UXXzxQbca8/u7zP/zDP2jMmDFavHjxYLQZ8/qzz88++6wKCgq0ZMkSpaamatq0afrFL36h3t7ewWo7JvVnr2fNmqXm5ubwr43efvttNTQ06Bvf+Mag9HwuGKrXwWHx5Yf91dHRod7eXqWmpkaMp6am6sCBA1Hn+P3+qPV+v3/A+ox1/dnnL7rzzjuVlpZ20r8k+Fx/9vmFF17Q+vXrtXfv3kHocHjozz6//fbb+t3vfqfvfve7amho0Jtvvqkf//jHOn78uCoqKgaj7ZjUn73+zne+o46ODs2ePVuWZenEiRP64Q9/qPLy8sFo+ZxwqtfBYDCo//3f/9V55503IM97Tl9hQWx44IEHVFtbq2eeeUYul2uo2xk2jh07poULF+qxxx5TSkrKULczrIVCIY0ZM0br1q1Tbm6uioqKdNddd6mmpmaoWxt2du7cqV/84hf6l3/5F7W0tOjpp5/Wtm3btHr16qFuDV/SOX2FJSUlRfHx8QoEAhHjgUBAbrc76hy3222rHv3b5888/PDDeuCBB/Tcc8/pyiuvHMg2Y57dfX7rrbf07rvv6vrrrw+PhUIhSVJCQoIOHjyoiRMnDmzTMag/f57Hjh2rESNGKD4+Pjw2depU+f1+9fT0KDExcUB7jlX92eu7775bCxcu1A9+8ANJUlZWlrq6unTbbbfprrvuUlwc/5/+ZZ3qdTApKWnArq5I5/gVlsTEROXm5qqpqSk8FgqF1NTUpIKCgqhzCgoKIuolaceOHaesR//2WZIeeughrV69Wo2NjZo+ffpgtBrT7O5zZmamXn31Ve3duzd83HDDDZo7d6727t2r9PT0wWw/ZvTnz/PVV1+tN998MxwIJen111/X2LFjCSun0Z+9/vjjj08KJZ8FRYuvzjsrhux1cEBv6Y0BtbW1ltPptDZu3Gi99tpr1m233WZdeOGFlt/vtyzLshYuXGitWLEiXP/iiy9aCQkJ1sMPP2zt37/fqqio4G3NfWB3nx944AErMTHR+vd//3fr/fffDx/Hjh0bqiXEBLv7/EW8S6hv7O5zW1ubNWrUKOv222+3Dh48aG3dutUaM2aMdd999w3VEmKG3b2uqKiwRo0aZT311FPW22+/bW3fvt2aOHGidfPNNw/VEox37Ngxq7W11WptbbUkWY888ojV2tpqvffee5ZlWdaKFSushQsXhus/e1vz8uXLrf3791vV1dW8rXmw/PKXv7QuueQSKzEx0crLy7Neeuml8GNz5syxiouLI+r/7d/+zZo8ebKVmJhoXXHFFda2bdsGuePYZGefL730UkvSSUdFRcXgNx5j7P55/r8ILH1nd5937dpl5efnW06n05owYYJ1//33WydOnBjkrmOTnb0+fvy4dc8991gTJ060XC6XlZ6ebv34xz+2/vznPw9+4zHi97//fdT/3n62r8XFxdacOXNOmpOTk2MlJiZaEyZMsB5//PEB79NhWVwjAwAAZjun72EBAACxgcACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADilP/zhD7r++uuVlpYmh8Oh+vp62+ewLEsPP/ywJk+eLKfTqXHjxun++++3dY5z+ssPAQDA6XV1dSk7O1t/+7d/q5tuuqlf51i2bJm2b9+uhx9+WFlZWfrggw/0wQcf2DoHn3QLAAD6xOFw6JlnnlFhYWF4rLu7W3fddZeeeuopffjhh5o2bZoefPBBfe1rX5Mk7d+/X1deeaX27dunKVOm9Pu5+ZUQAADot9tvv10+n0+1tbV65ZVX9O1vf1vz5s3TG2+8IUn6zW9+owkTJmjr1q0aP368MjIy9IMf/MD2FRYCCwAA6Je2tjY9/vjjqqur0zXXXKOJEyfqZz/7mWbPnq3HH39ckvT222/rvffeU11dnZ544glt3LhRzc3N+ta3vmXrubiHBQAA9Murr76q3t5eTZ48OWK8u7tbo0ePliSFQiF1d3friSeeCNetX79eubm5OnjwYJ9/TURgAQAA/fLRRx8pPj5ezc3Nio+Pj3jsggsukCSNHTtWCQkJEaFm6tSpkj69QkNgAQAAA+qrX/2qent71d7ermuuuSZqzdVXX60TJ07orbfe0sSJEyVJr7/+uiTp0ksv7fNz8S4hAABwSh999JHefPNNSZ8GlEceeURz587VxRdfrEsuuUTf+9739OKLL6qqqkpf/epXdfToUTU1NenKK6/U/PnzFQqFNGPGDF1wwQVas2aNQqGQlixZoqSkJG3fvr3PfRBYAADAKe3cuVNz5849aby4uFgbN27U8ePHdd999+mJJ57Q4cOHlZKSopkzZ+ree+9VVlaWJOnIkSNaunSptm/frpEjR+rrX/+6qqqqdPHFF/e5DwILAAAwHm9rBgAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4/x/Nd82OjSkPUgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def run_experiment(n_datapoints=20, threshold=0.8):\n",
    "    # Note that all data here is randomly chosen\n",
    "    x_random = np.random.random(n_datapoints)\n",
    "    y_random = np.random.random(n_datapoints)\n",
    "    corr = np.corrcoef(x_random, y_random)[0,1]\n",
    "    return corr > threshold\n",
    "\n",
    "\n",
    "def run_many_experiments(n_experiments=1000, n_datapoints=20, threshold=0.8):\n",
    "    false_positives = 0\n",
    "\n",
    "    for _ in range(n_experiments):\n",
    "        if run_experiment(n_datapoints=n_datapoints, threshold=threshold):\n",
    "            false_positives += 1\n",
    "    return false_positives / n_experiments\n",
    "\n",
    "# Relationship between data size and FP rate\n",
    "data_size = np.logspace(1, 6, 6, dtype=np.int)\n",
    "fp_rate_datapoints = np.fromiter((run_many_experiments(n_datapoints=d, threshold=0.5) for d in data_size), dtype=np.float32)\n",
    "\n",
    "plt.plot(data_size, fp_rate_datapoints)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*For solutions, see `solutions/false_positives.py`*"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
